import cv2 as cv
import numpy as np
from myFFT import myfft_function
import time


def Open_Frame_IRV(inpath, frame, width, hight): # 这一函数用于读取irv格式的红外视频AD值，传入视频地址、读取帧数、视频宽高。返回当前帧的AD值
    f = open(inpath, "rb")  # rb：也即 binary mode，read()操作返回的是bytes
    # frame  = 10   #irv：32*1024 视频的头，(640*480*2+1024) 一帧的长度
    f.seek(32 * 1024 + (frame - 1) * (hight * width * 2 + 1024), 0)  # 第一个代表需要移动偏移的字节数,0 代表从文件开头开始算起
    ccc = f.read(hight * width * 2)  # python在读取文件的时候是根据光标位置来读取的。读一行以后光标位置到了下一行。再来个read又到了下一行。 hight * width * 2是因为两个位内存存储一个ad值
    img = np.frombuffer(ccc, dtype='uint16')  # read的数值以bytes的类型保存，通过np.frombuffer方法还原成类型为uint16的ndarray，这种方式还原出来的ndarray是只读的。
    img = img.reshape((hight, width))
    f.close()
    return img


if __name__ == '__main__':  # 独立运行时测试用
    fft_images = r"E:\studylife\detectflaws\code\testcpp\lockPha\lockPha\mapAndResult\fftResult\7_18\20cmhz0.5zuoshang"  # 结果图像的保存路径
    videos_path = r"E:\红外实验视频\2023.07.10\0012.IRV"  # irv视频存放地址

    # 初始化要计算的图片区域
    columns_high = 640
    columns_low = 0
    rows_high = 480
    rows_low = 0

    # 下采样次数 Number of downsampling times   1为不做下采样
    nodt = 4
    # 所计算的视频的起始帧数
    map_quantity_begin = 1
    # 所计算的视频的结束帧数
    map_quantity_end = 700
    # 所要选取的频率
    Hz = 0.14

    time_start = time.time()  # 开始计时

    # 下采样后输出的图片尺寸
    row = int(rows_high / nodt)
    columns = int(columns_high / nodt)

    # 创建输出的幅值列表
    list_amp_gray = []
    # 创建输出的相位列表
    list_pha_gray = []

    # 创建列表存储对应帧数视频图像
    lists_gray = []
    array_gray = []
    for k in range(map_quantity_begin, map_quantity_end):  # 读取map_quantity帧图片计算fft
        img = Open_Frame_IRV(videos_path, k, 640, 480)  # 读取红外AD值
        # 为列表赋值
        lists_gray.append(img)
    array_gray = np.array(lists_gray)  # 把lists_gray转换成np.array类型方便后续裁切

    for i in range(rows_low, rows_high, nodt):  # nodt为步长即下采样
        for j in range(columns_low, columns_high, nodt):
            # fft运算得到指定频率幅度值和相位值
            amp_gray, pha_gray = myfft_function(array_gray[:, i, j], map_quantity_begin, map_quantity_end, Hz)
            # print(f'{i}行{j}列, gray:', amp_gray, pha_gray)
            # list_amp_gray.append(amp_gray)
            list_pha_gray.append(pha_gray)


    # 相位图
    # print('相位的列表', list_pha_gray)
    # 将1行的列表重构为图像行列
    list_pha_gray_re = np.reshape(list_pha_gray, (row, columns))
    # print('按行列排序后的相位蓝', list_pha_gray_re)
    # 将列表格式的数据转换为np.array格式便于后续直接输出图像
    array_pha_gray_re = np.array(list_pha_gray_re, dtype=np.uint8)
    array_pha_gray_re = cv.resize(array_pha_gray_re, (640, 480))
    # 保存图片
    # cv.imwrite(
    #     f'{fft_images}/nodt{nodt},Hz({Hz})pha_gray,r({rows_low},{rows_high})c({columns_low}, {columns_high})m({map_quantity_begin},{map_quantity_end}).jpg',
    #     array_pha_gray_re)
    # 展示图像
    cv.imshow('pha_gray', array_pha_gray_re)


    time_end = time.time()  # 结束计时
    time_c = time_end - time_start  # 运行所花时间
    print('time cost', time_c, 's')

    cv.waitKey(0)
    cv.destroyAllWindows()








